package org.yang.common.i18n.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import org.yang.common.i18n.enums.RI18nEnum;


/**
 * 国际化工具类
 *
 * @author: lslands
 * @version: 1.0
 * @create: 2024/5/10
 * @description:
 */
@Slf4j
@Component
public class I18nUtils implements ApplicationContextAware {

    private static MessageSource messageSource;

    /**
     * 传入message非国际化文件中内容时，出现异常，返回传入参数
     * @param message 传入消息
     * @param args 动态参数
     * @return 国际化消息
     */
    public static String message(String message,String... args) {
        try {
            return messageSource.getMessage(message,args,LocaleContextHolder.getLocale());
        }catch (RuntimeException  e){
            log.warn("【国际化 message】失败:{}",e.getMessage());
            return message;
        }
    }

    /**
     * 传入message非国际化文件中内容时，出现异常，返回传入参数
     * @param ri18nEnum 国际化枚举
     * @param args 动态参数
     * @return 国际化消息
     */
    public static String message(RI18nEnum ri18nEnum,String... args) {
        try {
            return messageSource.getMessage(ri18nEnum.getLocalMsg(),
                    args,ri18nEnum.getZhMsg(),
                    LocaleContextHolder.getLocale());
        }catch (RuntimeException  e){
            log.warn("【国际化 message】失败:{}",e.getMessage());
            return ri18nEnum.getZhMsg();
        }
    }

    /**
     *
     * @param message 国际化消息标识
     * @param defaultMessage 默认消息
     * @param args 动态参数
     * @return 国际化消息
     */
    public static String message(String message, String defaultMessage,String... args) {
        try {
            return messageSource.getMessage(message, args,defaultMessage,
                    LocaleContextHolder.getLocale());
        }catch (RuntimeException  e){
            try {
                return message.replaceAll("_"," ");
            }catch (RuntimeException ex){
                log.warn("【国际化】message截取失败:{}",ex.getMessage());
                return defaultMessage;
            }
        }
    }





    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (null == messageSource) {
            messageSource = applicationContext.getBean(MessageSource.class);
        }
    }
}
